package com.tsy.server.manage.service;

import com.tsy.server.component.mqtt.model.EventsReceiver;
import com.tsy.server.manage.model.dto.DeviceDTO;
import com.dji.sdk.cloudapi.firmware.OtaProgress;

import java.util.Optional;
import java.util.Set;

/**
 * @author sean
 * @version 1.4
 * @date 2023/3/21
 */
public interface IDeviceRedisService {

    /**
     * 判断设备是否在线。
     * @param sn 设备SN
     * @return
     */
    Boolean checkDeviceOnline(String sn);

    /**
     * 查询Redis中设备的基础信息。
     * @param sn 设备SN
     * @return
     */
    Optional<DeviceDTO> getDeviceOnline(String sn);

    /**
     * 保存设备基础信息到Redis。
     * @param device 设备数据
     */
    void setDeviceOnline(DeviceDTO device);

    /**
     * 删除Redis中保存的设备基础信息。
     * @param sn 设备SN
     * @return
     */
    Boolean delDeviceOnline(String sn);

    /**
     * 保存设备的OSD实时数据。
     * @param sn 设备SN
     * @param data OSD数据
     * @return
     */
    void setDeviceOsd(String sn, Object data);

    /**
     * 获取设备的OSD实时数据。
     * @param sn 设备SN
     * @param clazz 数据类型
     * @param <T> 返回数据泛型
     * @return
     */
    <T> Optional<T> getDeviceOsd(String sn, Class<T> clazz);
    /**
     * 删除设备的OSD实时数据。
     * @param sn 设备SN
     * @return
     */
    Boolean delDeviceOsd(String sn);

    /**
     * 在Redis中保存设备固件升级进度。
     * @param sn 设备SN
     * @param events 升级事件
     */
    void setFirmwareUpgrading(String sn, EventsReceiver<OtaProgress> events);

    /**
     * 查询Redis中的设备固件升级进度。
     * @param sn 设备SN
     * @return
     */
    Optional<EventsReceiver<OtaProgress>> getFirmwareUpgradingProgress(String sn);

    /**
     * 删除Redis中的设备固件升级进度。
     * @param sn 设备SN
     * @return
     */
    Boolean delFirmwareUpgrading(String sn);

    /**
     * 在Redis中保存设备HMS Key。
     * @param sn 设备SN
     * @param keys Key列表
     */
    void addEndHmsKeys(String sn, String... keys);

    /**
     * 查询Redis中设备的全部HMS Key。
     * @param sn 设备SN
     * @return
     */
    Set<String> getAllHmsKeys(String sn);

    /**
     * 删除Redis中设备的全部HMS Key。
     * @param sn 设备SN
     * @return
     */
    Boolean delHmsKeysBySn(String sn);

    void gatewayOffline(String gatewaySn);

    void subDeviceOffline(String deviceSn);
}
